package com.module.common.base.service;

import java.util.*;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.module.common.base.entity.MpBaseEntity;

/**
 * mybatis plus 通用service
 *
 * @param <T>
 *            实体类
 */
public interface MpCrudService<T extends MpBaseEntity> {

	/**
	 * Find resource by id
	 *
	 * @param id
	 *            Resource id
	 */
	Optional<T> findOne(Long id);

	/**
	 * Find all
	 */
	List<T> findAll();

	/**
	 * find by ids
	 *
	 * @param ids
	 *            ids
	 */
	List<T> findByIds(Collection<Long> ids);

	/**
	 * 通过id查询信息（包含归档信息）
	 *
	 * @param id
	 *            id
	 */
	Optional<T> findAllState(Long id);

	/**
	 * 查询所有信息（包含归档信息）
	 */
	List<T> findAllState();

	/**
	 * 通过id集合查询信息集合（包含归档信息）
	 */
	List<T> findAllState(Collection<Long> ids);

	/**
	 * Create new resource.
	 *
	 * @param resource
	 *            Resource to create
	 * @return new resource
	 */
	T create(T resource);

	/**
	 * batch Create resource
	 *
	 * @param resources
	 *            Resources to create
	 */
	List<T> batchCreate(List<T> resources);

	/**
	 * Update existing resource.
	 *
	 * @param resource
	 *            Resource to update
	 * @return resource updated
	 */
	void update(T resource);

	/**
	 * Update by id and state
	 * @param id id
	 * @param state state
	 */
	void updateByState(Long id, Integer state, T resource);

	/**
	 * Update existing resource by id with no null columns
	 *
	 * @param resource
	 *            Resource to update
	 * @return resource updated
	 */
	void updateAllProperties(T resource);

	/**
	 * batch update resource
	 *
	 * @param resources
	 *            Resources to update
	 */
	void batchUpdate(List<T> resources);

	/**
	 * Delete existing resource.
	 *
	 * @param id
	 *            Resource id
	 */
	void delete(Long id);

	/**
	 * Delete existing resource.
	 *
	 * @param ids
	 *            Resource id
	 */
	void batchDelete(List<Long> ids);

	/**
	 * 归档
	 */
	void achieve(Long id);

	/**
	 * 构建id和实体对象的映射
	 *
	 * @param entities
	 *            实体对象列表
	 */
	Map<Long, T> buildIdMap(List<T> entities);

	/**
	 * 根据ID查询实体对象， 然后构建id和实体对象的映射
	 *
	 * @param ids
	 *            实体对象列表
	 */
	Map<Long, T> getIdMap(List<Long> ids);

}
